package com.linyaonan.leetcode.easy._1046;

import com.linyaonan.leetcode.easy._67.AddBinary;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.PriorityQueue;

/**
 *
 * 有一堆石头，每块石头的重量都是正整数。
 *
 * 每一回合，从中选出两块最重的石头，然后将它们一起粉碎。假设石头的重量分别为 x 和 y，且 x <= y。那么粉碎的可能结果如下：
 *
 * 如果 x == y，那么两块石头都会被完全粉碎；
 * 如果 x != y，那么重量为 x 的石头将会完全粉碎，而重量为 y 的石头新重量为 y-x。
 * 最后，最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下，就返回 0。
 *
 *  
 *
 * 提示：
 *
 * 1 <= stones.length <= 30
 * 1 <= stones[i] <= 1000
 *
 *
 * @author: Lin
 * @date: 2020/1/12
 */
public class LastStoneWeight {

    /**
     * 常规解法
     * @param stones
     * @return
     */
    public int lastStoneWeight(int[] stones) {
        Arrays.sort(stones);
        List<Integer> list = new ArrayList<>();
        for (int i = stones.length - 1; i >= 0; i--) {
            list.add(stones[i]);
        }
        while (list.size() > 1) {
            int first = list.remove(0);
            int sec = list.remove(0);
            int ch = first - sec;
            int insertIndex = list.size();
            for (int i = 0; i < list.size(); i++) {
                if (ch > list.get(i)) {
                    insertIndex = i;
                    break;
                }
            }
            list.add(insertIndex, ch);
        }
        return list.get(0);
    }

    /**
     * 小根堆做法
     * @param stones
     * @return
     */
    public int lastStoneWeight2(int[] stones) {
        PriorityQueue<Integer> queue = new PriorityQueue<>((Integer o1, Integer o2) -> o2 - o1);
        for (int stone : stones) {
            queue.add(stone);
        }
        while (queue.size() > 1) {
            Integer fir = queue.poll();
            Integer sec = queue.poll();
            int ch = fir - sec;
            if (ch != 0) {
                queue.add(ch);
            }
        }

        if (queue.size() == 0) {
            return 0;
        } else {
            return queue.poll();
        }
    }
}
